package com.ctshk.rpc.system.service;


import com.ctshk.common.model.PageResponse;
import com.ctshk.common.model.TokenUser;
import com.ctshk.rpc.system.dto.UserDTO;
import com.ctshk.rpc.system.req.AddSysUserReq;
import com.ctshk.rpc.system.req.QuerySysUserReq;
import com.ctshk.rpc.system.req.UpdateMyInfoReq;

import java.util.List;
import java.util.Set;


/**
 * @description User相关服务api
 * @author 谢诗宏
 * @date 2020/12/15
 */
public interface ISysUserService {

	/**
	 * 根据userId 查询用户
	 * @param userId
	 * @return
	 */
	UserDTO getByUserId(Long userId);

	/**
	 * 使用正则表达式来判断字符串符合密码格式
	 * 必须满足 数字 大小写 特殊字符
	 * @param str 待检验的字符串
	 * @return  true: 符合格式 ;false 不符合格式
	 */
	boolean verifyTheFormat(String str);

	/**
	 * 登录
	 * @param u
	 * @return
	 */
	UserDTO login(UserDTO u);

	/**
	 * 查詢用戶
	 * @param u
	 * @return
	 */
	UserDTO getUser(UserDTO u);

	/**
	 * 分页查询用户列表
	 * @param querySysUserReq
	 * @return
	 */
	PageResponse<UserDTO> listUser(QuerySysUserReq querySysUserReq, TokenUser currentUser);

	/**
	 * 多表关联查询分页示例
	 * @param querySysUserReq
	 * @return
	 */
	PageResponse<UserDTO> users(QuerySysUserReq querySysUserReq);

	/**
	 * 根据id或者username查找用户-过滤删除标识
	 * @param param
	 * @param queryType
	 * 		==1时id;==2时username;==2时email
	 * @return
	 */
	UserDTO loadUserByParam(Object param, Integer queryType);

	/**
	 * 根据id或者username查找用户-不过滤删除标识
	 * @param param
	 * @param queryType
	 * 		==1时id;==2时username;==2时email
	 * @return
	 */
	UserDTO loadUserInfo(Object param, Integer queryType);

	/**
	 * 根据id查找缓存中的用户-不过滤删除标识
	 * @param userId
	 * @return
	 */
	UserDTO queryCacheUser(long userId);

	/**
	 * 根据id查找缓存中的用户-不过滤删除标识
	 * @param userId
	 * @return
	 */
	List<UserDTO> queryCacheUsers(Set<Long> userIds);

	/**
	 * 将所有用户存入缓存中,每天更新一遍
	 * @return
	 */
	void insertCacheUser();

	/**
	 * 重置密碼
	 * @param id
	 * @param password
	 * @return
	 */
	int resetPassword(long id, String password);

	/**
	 * 创建系统用户
	 * @param addSysUserReq
	 * @param userId
	 * @return
	 */
	long addUser(AddSysUserReq addSysUserReq, long userId);

	/**
	 * 删除用户
	 * @param id
	 * @param userId
	 * @return
	 */
	int del(long id, long userId);

	/**
	 * 修改用户
	 * @param addSysUserReq
	 * @param userId
	 * @return
	 */
	int update(AddSysUserReq addSysUserReq, long userId);

	/**修改我的信息
	 * @param req
	 * @param userId
	 */
	void updateMyInfo( UpdateMyInfoReq req, Long userId);

	/**修改当前登录用户的头像
	 * @param avatar
	 * @param userId
	 */
	void updateAvatar(String avatar, Long userId);

	/**
	 * 批量查询
	 * @param ids
	 * @return
	 */
	List<UserDTO> getUsers(Set<Long> ids);
}
